
package com.scjyzr.mysweeper;

import java.util.Random;

/**
 * 扫雷游戏业务类。
 */
public class Business {
    /**
     * 表示地雷的标示。
     */
    public static final int MINE_TAG = -1;

    // -1 表示地雷，0表示没有地雷，数量表示旁边的地雷数量
    private int[][] data = null;

    private int xSize;

    private int ySize;
    
    private int isNotMineSize;

    public Business(int x, int y, int mineCount) {
        super();
        xSize = x;
        ySize = y;
        initializeData(x, y, mineCount);
    }
    
    public void clear()
    {
        if(data!=null)
        {
            data=null;
        }
        
    }

    /**
     * 获取当前点地雷数量。
     * 
     * @param x
     * @param y
     * @return 如果是-1，表示是地雷.
     */
    public int getCurrent(int x, int y) {
        int value = 0;
        if ((x >= 0 && x < xSize) && (y >= 0 && y < ySize)) {
            return data[x][y];
            //这还需要增加一个功能，就是自动展开
        }
        return value;
    }
    
    /**
     * 获取所有的数据
     * @return 如果是-1，表示是地雷.
     */
    public int[][] getAllCurrent() {
        return data;
    }

    /**
     * 获取是地雷标示
     * @return
     */
    public static int getMineTag() {
        return MINE_TAG;
    }
    
    /**
     * 获取非地雷数量。
     * @return
     */
    public int getisNotMineSize()
    {
        return isNotMineSize;
    }

    /**
     * 初始化数据。
     */
    private void initializeData(int x, int y, int mineCount) {
        // 初始化容器
        data = new int[x][y];
        // 开始随机生成地雷
        if (mineCount > x * y) {
            mineCount = (x * y) / 4;
        }
        // 随机产生地雷
        Random rand = new Random();
        int xx = 0;
        int yy = 0;
        int size = mineCount;
        while (true) {
            xx = rand.nextInt(x - 1);
            yy = rand.nextInt(y - 1);
            if (data[xx][yy] != MINE_TAG) {
                data[xx][yy] = MINE_TAG;
                size--;
            }
            if (size <= 0) {
                break;
            }

        }

        // 开始计算容器中的值。
        for (int i = 0; i < x; i++) {
            for (int j = 0; j < y; j++) {
                if (data[i][j] != MINE_TAG) {
                    data[i][j] = getRound8Value(data, x, y, i, j);
                    isNotMineSize++;
                }
            }
        }

    }

    /**
     * 或者周围8个方块地雷的数量.
     * 
     * @param data
     * @param xSize
     * @param ySize
     * @param x
     * @param y
     * @return
     */
    private int getRound8Value(int[][] data, int xSize, int ySize, int i, int j) {
        int value = 0;
        // 判断点周围8个点的，上面三个点是否有地雷
        if ((i > 0 && i <= xSize)) {
            if ((j > 0 && j <= ySize) && (data[i - 1][j - 1] == MINE_TAG)) {
                value++;
            }
            if ((j >= 0 && j < ySize) && (data[i - 1][j] == MINE_TAG)) {
                value++;
            }
            if ((j >= 0 && j < ySize - 1) && (data[i - 1][j + 1] == MINE_TAG)) {
                value++;
            }
        }
        // 判断当前点左右两个点是否有地雷
        if ((i >= 0 && i < xSize)) {
            if ((j > 0 && j <= ySize) && (data[i][j - 1] == MINE_TAG)) {
                value++;
            }
            if ((j >= 0 && j < ySize - 1) && (data[i][j + 1] == MINE_TAG)) {
                value++;
            }

        }
        // 判断当前点下面三个点是否有地雷
        if ((i >= 0 && i < (xSize - 1))) {
            if ((j > 0 && j <= ySize) && (data[i + 1][j - 1] == MINE_TAG)) {
                value++;
            }
            if ((j >= 0 && j < ySize) && (data[i + 1][j] == MINE_TAG)) {
                value++;
            }
            if ((j >= 0 && j < ySize - 1) && (data[i + 1][j + 1] == MINE_TAG)) {
                value++;
            }
        }
        return value;
    }

}
